import js from "@eslint/js"
import pluginVue from "eslint-plugin-vue"
import oxlint from "eslint-plugin-oxlint"
import { readFileSync } from "fs"

// 读取自动导入json文件的全局变量
const autoImportGlobalsPath = new URL("vite/autoImport/.eslintrc-auto-import.json", import.meta.url)
const autoImportGlobals = JSON.parse(readFileSync(autoImportGlobalsPath, "utf8"))

export default [
    // 启用 ESLint 推荐的JavaScript核心规则集
    js.configs.recommended,

    // 启用 Vue 的推荐规则配置
    // strongly-recommended 包含了更严格的 Vue 规则集
    ...pluginVue.configs["flat/strongly-recommended"],

    // 启用 Oxlint 的推荐规则配置--高性能的 JavaScript linter
    oxlint.configs["flat/recommended"],

    // 定义需要进行 lint 检查的文件
    {
        name: "app/files-to-lint", files: ["**/*.{js,mjs,jsx,vue}"],
    },

    // 定义不需要进行 lint 检查的文件和目录
    {
        name: "app/files-to-ignore", ignores: [
            "**/dist/**", // 忽略构建输出目录
            "**/dist-ssr/**", // 忽略 SSR 构建输出目录
            "**/coverage/**", // 忽略测试覆盖率报告目录
            "**/node_modules/**", // 忽略依赖包目录
        ],
    },

    // 全局语言和 lint 选项配置
    {
        languageOptions: {
            ecmaVersion: "latest", // 使用最新的 ECMAScript 特性
            sourceType: "module", // 使用 ES 模块
            globals: {
                // 定义全局变量
                process: "readonly", // process 对象为只读
                ...autoImportGlobals.globals, // 导入自动生成的全局变量
            },
        }, linterOptions: {
            reportUnusedDisableDirectives: true, // 报告未使用的 eslint-disable 注释
        },
    },

    // Vue 文件特定规则配置
    {
        files: ["**/*.vue"], rules: {
            // Vue 模板和组件规则
            "vue/max-attributes-per-line": ["warn", {singleline: 10}], // 单行最多 10 个属性
            "vue/singleline-html-element-content-newline": "off", // 关闭单行内容换行要求
            "vue/multiline-html-element-content-newline": "off", // 关闭多行内容换行要求
            "vue/multi-word-component-names": "off", // 关闭组件名必须多个单词的限制
            "vue/no-v-html": "off", // 允许使用 v-html

            // Vue3 特定规则
            "vue/no-deprecated-v-on-native-modifier": "error", // 禁用废弃的 v-on 原生修饰符
            "vue/no-deprecated-v-bind-sync": "error", // 禁用废弃的 .sync 修饰符
            "vue/script-setup-uses-vars": "error", // 确保 setup 中的变量被正确使用
            "vue/no-deprecated-dollar-scopedslots-api": "error", // 禁用废弃的 $scopedSlots
            // 删除将强制使用<div/>形式的规则
            "vue/html-self-closing": [
                "error", {
                    "html": {
                        "void": "always",
                        "normal": "any",  // 设置为 never 来强制使用 <div></div> 形式
                        "component": "always"
                    }
                }
            ]
        },
    },

    // 通用 JavaScript 代码规则
    {
        rules: {
            // 生产环境相关规则
            "no-console": process.env.NODE_ENV === "production" ? "warn" : "off", // 生产环境警告 console
            "no-debugger": process.env.NODE_ENV === "production" ? "error" : "off", // 生产环境禁止 debugger

            // 代码质量规则
            eqeqeq: ["error", "always", {null: "ignore"}], // 必须使用 === 和 !==（除了 null 判断）
            semi: ["error", "never"], // 禁止使用分号
            "prefer-const": "error", // 优先使用 const 声明变量
            "no-var": "error", // 禁止使用 var

            // 未使用的变量   参数未使用警告
            // "no-unused-vars": ["warn", {vars: "all", args: "none"}],
            // 未定义的变量
            "no-undef": "error",
        },
    },
]
